Allow -1 for width/height and interpret them as "not constrained".
authorMatthias Clasen <mclasen@redhat.com>
Fri, 1 Jul 2005 16:52:33 +0000 (16:52 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 1 Jul 2005 16:52:33 +0000 (16:52 +0000)
2005-07-01  Matthias Clasen  <mclasen@redhat.com>

* gdk-pixbuf-io.c (gdk_pixbuf_new_from_file_at_scale): Allow
-1 for width/height and interpret them as "not constrained".
(#309258, Mark McLoughlin)

gdk-pixbuf/ChangeLog
gdk-pixbuf/gdk-pixbuf-io.c

index cb4fe665fb8e221b6ccfa8372a3c87d651539cf1..d56ba12fdf7855f7f29a7d792cdad23e2843cad6 100644 (file)
@@ -1,3 +1,9 @@
+2005-07-01  Matthias Clasen  <mclasen@redhat.com>
+
+       * gdk-pixbuf-io.c (gdk_pixbuf_new_from_file_at_scale): Allow
+       -1 for width/height and interpret them as "not constrained".
+       (#309258, Mark McLoughlin)
+
 2005-06-26  Tor Lillqvist  <tml@novell.com>
 
        * Makefile.am: Current GNU tools do understand the PRIVATE
index 76b91653e338cd5e7a7002b7b4204e74c70025a3..dc0408d2f7214aa573c5dc655bd29c8787006e07 100644 (file)
@@ -939,9 +939,20 @@ size_prepared_cb (GdkPixbufLoader *loader,
 
        g_return_if_fail (width > 0 && height > 0);
 
-       if(info->preserve_aspect_ratio) {
-               if ((double)height * (double)info->width >
-                   (double)width * (double)info->height) {
+       if (info->preserve_aspect_ratio && 
+           (info->width > 0 || info->height > 0)) {
+               if (info->width < 0)
+               {
+                       width = width * (double)info->height/(double)height;
+                       height = info->height;
+               }
+               else if (info->height < 0)
+               {
+                       height = height * (double)info->width/(double)width;
+                       width = info->width;
+               }
+               else if ((double)height * (double)info->width >
+                        (double)width * (double)info->height) {
                        width = 0.5 + (double)width * (double)info->height / (double)height;
                        height = info->height;
                } else {
@@ -949,8 +960,10 @@ size_prepared_cb (GdkPixbufLoader *loader,
                        width = info->width;
                }
        } else {
-               width = info->width;
-               height = info->height;
+               if (info->width > 0)
+                       width = info->width;
+               if (info->height > 0)
+                       height = info->height;
        }
        
        gdk_pixbuf_loader_set_size (loader, width, height);
@@ -959,8 +972,8 @@ size_prepared_cb (GdkPixbufLoader *loader,
 /**
  * gdk_pixbuf_new_from_file_at_size:
  * @filename: Name of file to load, in the GLib file name encoding
- * @width: The width the image should have
- * @height: The height the image should have
+ * @width: The width the image should have or -1 to not constrain the width
+ * @height: The height the image should have or -1 to not constrain the height
  * @error: Return location for an error
  *
  * Creates a new pixbuf by loading an image from a file.  The file format is
@@ -1018,8 +1031,8 @@ gdk_pixbuf_new_from_file_at_size (const char *filename,
 /**
  * gdk_pixbuf_new_from_file_at_scale:
  * @filename: Name of file to load, in the GLib file name encoding
- * @width: The width the image should have
- * @height: The height the image should have
+ * @width: The width the image should have or -1 to not constrain the width
+ * @height: The height the image should have or -1 to not constrain the height
  * @preserve_aspect_ratio: %TRUE to preserve the image's aspect ratio
  * @error: Return location for an error
  *
@@ -1027,7 +1040,14 @@ gdk_pixbuf_new_from_file_at_size (const char *filename,
  * detected automatically. If %NULL is returned, then @error will be set.
  * Possible errors are in the #GDK_PIXBUF_ERROR and #G_FILE_ERROR domains.
  * The image will be scaled to fit in the requested size, optionally preserving
- * the image's aspect ratio.
+ * the image's aspect ratio. 
+ *
+ * When preserving the aspect ratio, a @width of -1 will cause the image
+ * to be scaled to the exact given height, and a @height of -1 will cause
+ * the image to be scaled to the exact given width. When not preserving
+ * aspect ratio, a @width or @height of -1 means to not scale the image 
+ * at all in that dimension. Negative values for @width and @height are 
+ * allowed since 2.8.
  *
  * Return value: A newly-created pixbuf with a reference count of 1, or %NULL 
  * if any of several error conditions occurred:  the file could not be opened,
@@ -1057,7 +1077,8 @@ gdk_pixbuf_new_from_file_at_scale (const char *filename,
        } info;
 
        g_return_val_if_fail (filename != NULL, NULL);
-        g_return_val_if_fail (width > 0 && height > 0, NULL);
+        g_return_val_if_fail (width > 0 || width == -1, NULL);
+        g_return_val_if_fail (height > 0 || height == -1, NULL);
 
        f = g_fopen (filename, "rb");
        if (!f) {